package account;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.GridLayout;
import java.awt.event.ActionListener;
import java.text.DecimalFormat;
import java.util.Observable;
import java.util.Observer;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;

/**
 * Anzeigeklasse fuer ein Kontoformular.<br>
 * Eingabefelder fur die Ein- und Auszahlung eine Geldbetrages.<br>
 * Jedes Objekt der Klasse ist mit einem festen Kontoindex verbunden.
 *
 * @author Patrick Bauer
 */
public class AccountActionView extends JPanel implements Observer{
    /**
     * Der Index des zu verwaltenden Kontos
     */
    private int index;

    /**
     * Das Kontomodel zum auslesen neuer Daten aus dem Model.
     */
    private AccountModel model;

    /**
     * Texteingabefeld zur Einzahlung von Geldbetraegen.
     */
    private JTextField raise = new JTextField();

    /**
     * Texteingabefeld zur Ausgabe von Geldbetraegen.
     */
    private JTextField lower = new JTextField();

    /**
     * Nicht editierbares Textfeld zur Ausgabe des Kontostandes.
     */
    private JTextField accountBalance = new JTextField("0,00");

    /**
     * Label zur Anzeige von Fehlermeldungen
     */
    private JLabel errorOutput = new JLabel(" ");
    

    /**
     * Initialisiert das Formular und ordnet Ein- und Ausgabeelemente an.<br>
     * Bekommt das zu verwaltende Konto als Index uebergeben, sowie das Datenmodel zum Zugriff auf neue Daten.
     *
     * @param i der Index des zu verwaltenden Kontos
     * @param model das Datenmodel zum Zugriff auf neue Daten
     */
    public AccountActionView(int i, AccountModel model) {
        this.setLayout(new BorderLayout(0, 7));
        
        GridLayout gridLayout = new GridLayout(3, 2);
        gridLayout.setVgap(5);
        gridLayout.setHgap(5);
        JPanel grid = new JPanel(gridLayout);
        
        this.model = model;
        this.index = i;
        this.errorOutput.setForeground(Color.red);
        this.raise.setName("Raise");
        this.lower.setName("Lower");
        this.accountBalance.setEditable(false);
        
        JLabel accountNumber = new JLabel();
        accountNumber.setForeground(this.model.getColorbyIndex(i));
        accountNumber.setText("Kontonummer: 528597" + i);
        
        grid.add(new JLabel("Kontostand:"));
        grid.add(accountBalance);
        grid.add(new JLabel("Euro"));
        
        grid.add(new JLabel("Einzahlung:"));
        grid.add(raise);
        grid.add(new JLabel("Euro"));
        
        grid.add(new JLabel("Auszahlung:"));
        grid.add(lower);
        grid.add(new JLabel("Euro"));
        
        this.add(accountNumber, BorderLayout.NORTH);
        this.add(grid, BorderLayout.CENTER);
        this.add(errorOutput, BorderLayout.SOUTH);
    }
    
    /**
     * Fuegt dem Einzahlungsfeld einen ActionListener hinzu
     *
     * @param listener zu benutzender ActionListener
     */
    public void addRaiseListener(ActionListener listener) {
        this.raise.addActionListener(listener);
    }

    /**
     * Fuegt dem Auszahlungsfeld einen ActionListener hinzu
     *
     * @param listener zu benutzender ActionListener
     */
    public void addLowerListener(ActionListener listener) {
        this.lower.addActionListener(listener);
    }
    

    /**
     * Wird vom Observable aufgerufen und bekommt Daten einer Tranksaktion.<br>
     * Diese Daten werden zur Anzeige des neuen Kontostandes benutzt.
     *
     * @param o das AccountModel
     * @param arg die AccountAction
     */
    @Override
    public void update(Observable o, Object arg) {
        AccountAction action = (AccountAction) arg;
        AccountModel accountModel = (AccountModel) o;
        
        if(action.getAccountIndex() == this.index){
            DecimalFormat twoDForm = new DecimalFormat("0.00");
           
            this.accountBalance.setText(twoDForm.format(accountModel.getBalancebyIndex(action.getAccountIndex())));
        }
    }

    /**
     * Liefert den Index des zu verwaltenden Kontos
     *
     * @return der Kontoindex
     */
    public int getIndex() {
        return index;
    }


    /**
     * Setzt die Fehlermeldung dieses Formulares.
     *
     * @param s die zu setzende Fehlermeldung
     */
    public void setErrorMessage(String s) {
        this.errorOutput.setText(s);
    }
    
}
